 /*
  * Copyright (c) 2018  STMicroelectronics – All rights reserved
  * The STMicroelectronics corporate logo is a trademark of STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *
  * - Redistributions of source code must retain the above copyright notice, this list of conditions
  * and the following disclaimer.
  *
  * - Redistributions in binary form must reproduce the above copyright notice, this list of
  * conditions and the following disclaimer in the documentation and/or other materials provided
  * with the distribution.
  *
  * - Neither the name nor trademarks of STMicroelectronics International N.V. nor any other
  * STMicroelectronics company nor the names of its contributors may be used to endorse or
  * promote products derived from this software without specific prior written permission.
  *
  * - All of the icons, pictures, logos and other images that are provided with the source code
  * in a directory whose title begins with st_images may only be used for internal purposes and
  * shall not be redistributed to any third party or modified in any way.
  *
  * - Any redistributions in binary form shall not include the capability to display any of the
  * icons, pictures, logos and other images that are provided with the source code in a directory
  * whose title begins with st_images.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
  * OF SUCH DAMAGE.
  */

import Foundation
import SmarTagLib
import SmarTagCloudLibCommon

 public class SmarTagCloudExported {
    
    private let mProvider:CloudSyncProvider?
    private let mLocationService = SmarTagLocationService()
    
    public init(id:String){
        let config = SmarTagCloudConfigUtil.defaultInstance
        mProvider = CloudProviderBuilder.build(id: id, param: config)
    }
    
    public func sync(data:SmarTagData, onComplete:@escaping (SmarTagCloudSyncError?)->()){
        let propagateError = { (error:SmarTagCloudSyncError) in
            onComplete(error)
        }
        mLocationService.readCurrentLocation{ [weak self] location in
            NSLog("Connecting...")
            self?.mProvider?.connect(onSuccess: { conn in
                NSLog("Connected")
                self?.mProvider?.uploadSamples(conn: conn, samples: data.samples, currentLocation: location,
                onSuccess: { conn in
                    NSLog("Data Sample Uploaded")
                    self?.mProvider?.uploadSamples(conn: conn, extremeData: data.dataExtreme, currentLocation: location,
                    onSuccess: { conn in
                        NSLog("Data Extreme Uploaded, Disconnecting")
                        self?.mProvider?.disconnect(conn: conn)
                        onComplete(nil)
                    }, onError: propagateError)
                }, onError: propagateError
                )//uploadSample
            }, onError: propagateError
            )//connect
        }
    }
    
 }
 
 
 import SmarTagCloudLibMqtt

 public struct CloudProviderBuilder{
     
     public static func build(id:String,param:SmarTagCloudConfig)->CloudSyncProvider?{
         switch param.provider {
         case MqttProvider.NAME:
             return MqttProvider(tagId: id, config: MqttConfigStorageUtil.defaultInstance)
         default:
             return nil
         }
     }
     
 }
